<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <style>
        body {
            font-family: SimSun;
            line-height: 30px;
        }

        .title{
            text-align: center;
        }
        
        .version-control th {
            background: #002060;
            color: #fff;
            height: 50px;
        }

        .catalog {
            margin: 100px auto 0;
        }

        li {
            text-align: left;
            list-style: none;
            position: relative;
            line-height: 50px;
            display: flex;
        }

        .catalog .title {
            color: #2e74cf;
            font-size: 18px;
        }

        .catalog li.second {
            margin-left: 20px;
        }

        .catalog li.third {
            margin-left: 40px;
        }

        .catalog .sectionNum {
            padding-right: 10px;
        }

        .catalog ul li div {
            display: inline-block;
        }

        .catalog .catelogTitle {
            width: fit-content;
        }

        .catalog .list-line {
            border-top: 1px dashed #000;
            margin: 25px 5px;
            flex: 1;
        }

        .catalog .page {
            padding: 0 5px;
            padding-right: 80px;
            width: fit-content;
        }

        .steps {
            width: 100%;
            margin-top: 100px;
        }

        .steps .step1 {
            margin-top: 20px;
            font-size: 24px;
            font-weight: 800;
        }

        .steps .step2 {
            font-size: 18px;
            margin-top: 20px;
            margin-left: 20px;
            font-weight: 500;
        }

        .steps .step3 {
            font-size: 14px;
            margin-top: 10px;
            margin-left: 40px;
            font-weight: 500;
        }

        .steps th {
            background: #606060;
        }

        .text-indent20 {
            text-indent: 20px;
        }

        .text-indent40 {
            text-indent: 40px;
        }

    </style>
</head>

<body>
<!-- 接口文档 -->
<section class="title">
    <br/>
    <br/>
    <br/>
    <br/>
    <br/>
    <br/>
    <br/>
    <h1 class="title">接口文档</h1>
    <h1 class="version">V1.0</h1>
    <br/>
    <br/>
    <br/>
    <br/>
    <br/>
    <br/>
    <br/>
    <br/>
    <br/>
    <br/>
    <br/>
    <br/>
    <br/>
</section>

<!-- 版本控制信息 -->
<section class="version-control">
    <table border="1px" width="90%" height="100px" cellspacing="0" align="center">
        <caption>
            <h2>版本控制信息</h2>
            <br/>
        </caption>
        <thead>
        <tr align="center">
            <th width="10%">序号</th>
            <th width="10%">版本</th>
            <th width="20%">修改日期</th>
            <th width="20%">修改人</th>
            <th width="40%">说明</th>
        </tr>
        </thead>
        <tbody>
        <tr align="center">
            <td width="10%">1</td>
            <td width="10%">1.0</td>
            <td width="20%">2019-10-09</td>
            <td width="20%">jecklin</td>
            <td width="40%">全文创建</td>
        </tr>
        </tbody>
    </table>
    <br/>
    <br/>
    <br/>
</section>

<!-- 正文 -->
<section class="steps">
    <div class="step1">
        1.接入前准备工作
        <div class="step2">
            1.权限申请
            <div class="step3">
                <p>1.申请fappid ,fapptoken</p>
                <p>2.测试fappid: ${fappid}</p>
                <p>3.测试fapptoken: ${fapptoken}</p>
                <p>4.生产fappid: 上线时找系统方提供</p>
                <p>5.生产fapptoken: 上线时找系统方提供</p>
            </div>
        </div>
    </div>
    <div class="step1">
        2.通信规范
        <div class="step2">
            1.采用L5通信
            <div class="step3">
                <p>1.测试：64403329:393216</p>
                <p>2.生产：64403329:458752</p>
            </div>
        </div>
        <div class="step2">
            2.post方式提交数据
        </div>
        <div class="step2">
            3.报文采用UTF-8编码格式
        </div>
        <div class="step2">
            4.Content-Type
            <div class="step3">
                <p>1.request: application/json</p>
                <p>2.response: application/json</p>
            </div>
        </div>
        <div class="step2">
            5.身份证号码的x字母，统一用小写
        </div>
    </div>
    <div class="step1">
        3.安全规范
        <div class="step2">
            3.1.加密机制
        </div>
        <div class="step2">
            3.2.签名机制
            <div class="step3">
                <p>1.第一步，设所有发送或者接收到的数据为集合M，将集合M内非空参数值的参数按照参数名ASCII码从小到大排序（字典序），使用URL键值对的格式（即key1=value1&amp;key2=value2…）拼接成字符串stringA。（说明：参数值为空不参与签名）
                </p>
                <p>2.第二步，在stringA最后拼接上fappToken得到stringSignTemp字符串(stringSignTemp=stringA&amp;fappToken=tokenValue），并对stringSignTemp进行HMAC-SHA256运算以及base64编码，再将得到的字符串所有字符转换为大写，得到sign值signValue。
                </p>
            </div>
        </div>
    </div>
    <div class="step1">
        4.ABTest接口协议
        <div class="step2">
            4.1.接口入参
        </div>
        <div class="step2">
            <div class="step3">
                <p>url路径：http://ip:port/crisk/exeabtest.do</p>
                <p>4.1.1.请求数据字段</p>
                <table border="1px" width="90%" height="100px" cellspacing="0">
                    <thead>
                    <tr align="center">
                        <th width="20%">字段名</th>
                        <th width="10%">类型</th>
                        <th width="10%">必填</th>
                        <th width="60%">说明</th>
                    </tr>
                    </thead>
                    <tbody>
                    <tr align="center">
                        <td>fappid</td>
                        <td>string</td>
                        <td>是</td>
                        <td>应用ID，接口方提供</td>
                    </tr>
                    <tr align="center">
                        <td>timestamp</td>
                        <td>string</td>
                        <td>是</td>
                        <td>时间戳, 发送请求的时间，若与标准时间相差超过5分钟则签名验证失败</td>
                    </tr>
                    <tr align="center">
                        <td>nonce</td>
                        <td>string</td>
                        <td>是</td>
                        <td>随机数</td>
                    </tr>
                    <tr align="center">
                        <td>version</td>
                        <td>string</td>
                        <td>是</td>
                        <td>固定值：2</td>
                    </tr>
                    <tr align="center">
                        <td>sign</td>
                        <td>string</td>
                        <td>是</td>
                        <td>参考3.2签名机制</td>
                    </tr>
                    <tr align="center">
                        <td>fplatform</td>
                        <td>string</td>
                        <td>是</td>
                        <td>平台：1：微信公众号2：QQ公众号
                            3：H5 4：小程序5：APP</td>
                    </tr>
                    <tr align="center">
                        <td>fuinType</td>
                        <td>string</td>
                        <td>是</td>
                        <td>账号类型： 1：微信支付id 2：QQ号
                            3：imei号/其它设备号4：md5手机号
                            5：md5证件号</td>
                    </tr>
                    <tr align="center">
                        <td>fuin</td>
                        <td>string</td>
                        <td>是</td>
                        <td>例如微信支付uin，qq号，设备号、身份证号等</td>
                    </tr>
                    <tr align="center">
                        <td>sceneId</td>
                        <td>string</td>
                        <td>是</td>
                        <td>场景id（${sceneId}）</td>
                    </tr>
                    <tr align="center">
                        <td>paramJsons</td>
                        <td>string</td>
                        <td>否</td>
                        <td>业务数据，以json字符串传送"{
                        ${sss!}<#list inParams as param>
                           "${param.inParamEnName}":"${param.inParamCnName}"${param.inParamSymbol}
                            </#list>
                            }"</td>
                    </tr>
                    </tbody>
                </table>
                <p>4.1.2.返回参数</p>
                <table border="1px" width="90%" height="100px" cellspacing="0">
                    <thead>
                    <tr align="center">
                        <th width="20%">字段名</th>
                        <th width="10%">类型</th>
                        <th width="10%">必填</th>
                        <th width="60%">说明</th>
                    </tr>
                    </thead>
                    <tbody>
                    <tr align="center">
                        <td>code</td>
                        <td>string</td>
                        <td>是</td>
                        <td>状态码 200 表示成功，其它表示错误</td>
                    </tr>
                    <tr align="center">
                        <td>message</td>
                        <td>string</td>
                        <td>是</td>
                        <td>状态信息说明</td>
                    </tr>
                    <tr align="center">
                        <td>data</td>
                        <td>Object</td>
                        <td>是</td>
                        <td>返回结果</td>
                    </tr>
                    </tbody>
                </table>
                <p>data属性说明: 根据场景不同，返回的数据也不同，下面是一个样例</p>
                <table border="1px" width="90%" height="100px" cellspacing="0">
                    <thead>
                    <tr align="center">
                        <th width="20%">字段名</th>
                        <th width="10%">类型</th>
                        <th width="10%">必填</th>
                        <th width="60%">说明</th>
                    </tr>
                    </thead>
                    <tbody>
                    ${sss!}<#list outParams as param>
                    <tr align="center">
                        <td>${param.outParamEnName}</td>
                        <td>${param.outParamType}</td>
                        <td>${param.outParamState}</td>
                        <td>${param.outParamCnName}</td>
                    </tr>
                    </#list>
                    </tbody>
                </table>
                <p> 请求数据示例：</p>
                <p>{</p>
                <p class="text-indent20"> "sceneId": "123",</p>
                <p class="text-indent20"> "fappid": "XXX",</p>
                <p class="text-indent20"> "fplatform": "2",</p>
                <p class="text-indent20"> "fuin": "085e9858ef869493fb3cd893c@wx.tenpay.com",</p>
                <p class="text-indent20"> "fuinType": "1",</p>
                <p class="text-indent20"> "nonce": "XXXX",</p>
                <p class="text-indent20"> "paramJsons": "{
                ${sss!}<#list inParams as param>
                \"${param.inParamEnName}\":\"${param.inParamCnName}\"${param.inParamSymbol}
                </#list>
                    }",</p>
                <p class="text-indent20"> "sign": "XXXXX",</p>
                <p class="text-indent20"> "timestamp": "1562754552",</p>
                <p class="text-indent20"> "version": "2"</p>
                <p>}</p>
                <p>返回结果示例：</p>
                <p>{</p>
                <p class="text-indent20"> "code": "200",</p>
                <p class="text-indent20"> "data": {</p>
                        <#list outParamsResult as output>
                            <p class="text-indent40"> "${output.outParamEnName}":"${output.outParamCnName}"${output.outParamSymbol}
                            </p>
                        </#list>
                <p class="text-indent20"> },</p>
                <p class="text-indent20"> "message": "ok"</p>
                <p>}</p>
                <p style="color:red">注意：调用方需要考虑接口异常（例如超时）兜底或重试策略。</p>
            </div>
        </div>
    </div>
</section>
</body>

</html>